Amazon ECRのクロスリージョンレプリケーションを試してみた
こんにちは、岩城です。
先日、ECRのクロスリージョンレプリケーションを試す機会がありましたので共有します。
クロスリージョンレプリケーションを試すきっかけ
以下の構成で、ソウルリージョンのECSタスクが東京リージョンのECRにアクセスしようとした際、
以下のエラーメッセージが表示され、タスクの起動に失敗しました。
ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve ecr registry auth: service call has been retried 3 time(s): RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-1.amazonaws.com/": dial tcp 52.119.218.165:443: i/o timeout. Please check your task network configuration.
原因は、公式ドキュメントに記載のとおり、Fargateを使用するECSタスクでは、VPCエンドポイントを通じてのクロスリージョンECRアクセスができないという点にあります。
現在、VPC エンドポイントはクロスリージョンリクエストをサポートしていません。Amazon ECS に対して API コールを発行するリージョンと同じリージョンにエンドポイントを作成してください。
そこで、以下の構成で東京リージョンのECRをメインとし、ソウルリージョンにレプリカを作成する対応を取りました。
クロスリージョンレプリケーションとは
この機能は、その名の通り、異なるリージョンに存在するECR間でコンテナイメージをレプリケーションするものです。
同一AWSアカウント内の別リージョンにあるECRや、異なるAWSアカウントにあるECRへのレプリケーションが可能です。
本エントリでは、同一AWSアカウント内の別リージョンにあるECRにクロスリージョンレプリケーションを想定しています。
設定方法は簡単です。送信先タイプでクロスリージョンレプリケーションを有効化し、
送信先としてソウルリージョンを選択後、レプリケーションルールを追加して完了です。
クロスリージョンレプリケーションのポイント
クロスリージョンレプリケーションのポイントをまとめます。
レプリカへイメージがレプリケーションされるタイミング
レプリカへイメージがレプリケーションされるタイミングは、メインへイメージがプッシュされた時です。
このため、レプリカへの初期セットアップ時にイメージを反映するには2つの対応が考えられます。
1つ目は、メインにイメージをPushし、レプリケーションされるのを待ちます。
この時、レプリケーション先にリポジトリが存在しなければ、同名で作成された後にイメージがレプリケーションされるので問題ありません。
2つ目は、レプリカにメインと同名リポジトリを作成し、個別にイメージをPushします。
メインリポジトリと同名リポジトリであれば、既にリポジトリが存在してもレプリケーションされます。
このため、メインリポジトリの最新イメージをレプリカにPushしてイメージを合わせます。
レジストリ設定やリポジトリ設定はレプリケーションされない
レジストリ設定やリポジトリ設定はレプリケーションされないため、レプリカで個別に設定が必要です。
例えば、レジストリのスキャン設定、リポジトリのタグのイミュータビリティ設定、パーミッション設定、ライフサイクル設定は、レプリケーションの対象外です。
おわりに
東京リージョンに存在するリポジトリに、別リージョンのECSタスクからVPCエンドポイントを経由してアクセスしたところ、前述のとおりアクセスできないことが分かりました。
インターネット経由のアクセス方法もありますが、検証していた環境はインターネットへのアクセス経路がありませんでした。
このため、クロスリージョンレプリケーションをワークアラウンドとして採用しました。
本エントリが、どなかたのお役に立てれば幸いです。